#ifndef __TIC10024_API_H__
#define __TIC10024_API_H__

/******************************************************************************
        头文件
******************************************************************************/
#include <stdint.h>
#include <stdbool.h>

/******************************************************************************
    宏定义
******************************************************************************/

/******************************************************************************
    数据类型定义
******************************************************************************/
/**
 * \brief 通道
 *
 * 定义了通道的枚举类型，用于配置通道的编号。
 * 每个枚举值表示不同的通道编号，从 0 开始。
 *
 * \note 这些通道编号用于配置通道的编号，从 0 开始，直到 CHANNEL_ALL 表示所有通道。
 */
typedef enum
{
    CHANNEL_0 = 0,  // 通道0
    CHANNEL_1,      // 通道1
    CHANNEL_2,      // 通道2
    CHANNEL_3,      // 通道3
    CHANNEL_4,      // 通道4
    CHANNEL_5,      // 通道5
    CHANNEL_6,      // 通道6
    CHANNEL_7,      // 通道7
    CHANNEL_8,      // 通道8
    CHANNEL_9,      // 通道9
    CHANNEL_10,     // 通道10
    CHANNEL_11,     // 通道11
    CHANNEL_12,     // 通道12
    CHANNEL_13,     // 通道13
    CHANNEL_14,     // 通道14
    CHANNEL_15,     // 通道15
    CHANNEL_16,     // 通道16
    CHANNEL_17,     // 通道17
    CHANNEL_18,     // 通道18
    CHANNEL_19,     // 通道19
    CHANNEL_20,     // 通道20
    CHANNEL_21,     // 通道21
    CHANNEL_22,     // 通道22
    CHANNEL_23,     // 通道23
    CHANNEL_ALL     // 所有通道
} tic_channel;

/**
 * \brief 润湿电流
 *
 * 定义了润湿电流的枚举类型，用于配置润湿电流的大小。
 * 每个枚举值表示不同的润湿电流大小，单位为毫安。
 *
 * \note 这些电流值用于配置润湿电流的大小，以毫安为单位。
 *       例如，WC_0MA 表示 0 毫安的润湿电流，WC_1MA 表示 1 毫安的润湿电流，以此类推。
 */
typedef enum
{
    WC_0MA = 0, // 0 毫安
    WC_1MA,     // 1 毫安
    WC_2MA,     // 2 毫安
    WC_5MA,     // 5 毫安
    WC_10MA,    // 10 毫安
    WC_15MA     // 15 毫安
} wetting_current;

/**
 * \brief 比较器阈值
 *
 * 定义了比较器阈值的枚举类型，用于配置比较器的阈值。
 * 每个枚举值表示不同的阈值，单位为伏特。
 * 
 * \note 这些阈值用于配置比较器的阈值，以伏特为单位。
 */
typedef enum
{
    THRESHOLD_2V = 0,    // 2 伏特
    THRESHOLD_2_7V,      // 2.7 伏特
    THRESHOLD_3V,        // 3 伏特
    THRESHOLD_4V         // 4 伏特
} comparator_threshold;

/**
 * \brief 轮询时间
 *
 * 定义了轮询时间的枚举类型，用于配置轮询的时间间隔。
 * 每个枚举值表示不同的时间间隔，单位为毫秒。
 * 
 * \note 这些时间值用于配置轮询的时间间隔，以毫秒为单位。
 */
typedef enum
{
    POLL_TIME_2MS = 0,  // 2 毫秒
    POLL_TIME_4MS,      // 4 毫秒
    POLL_TIME_8MS,      // 8 毫秒
    POLL_TIME_16MS,     // 16 毫秒
    POLL_TIME_32MS,     // 32 毫秒
    POLL_TIME_48MS,     // 48 毫秒
    POLL_TIME_64MS,     // 64 毫秒
    POLL_TIME_128MS,    // 128 毫秒
    POLL_TIME_256MS,    // 256 毫秒
    POLL_TIME_512MS,    // 512 毫秒
    POLL_TIME_1024MS,   // 1024 毫秒
    POLL_TIME_2048MS,   // 2048 毫秒
    POLL_TIME_4096MS,   // 4096 毫秒
} poll_time;

/**
 * \brief 轮询激活时间
 *
 * 定义了轮询激活时间的枚举类型，用于配置轮询激活的间隔时间。
 * 每个枚举值表示不同的激活时间，单位为微秒。
 * 
 * \note 这些时间值用于配置轮询激活的时间间隔，以微秒为单位。
 */
typedef enum
{
    POLL_ACT_TIME_64US = 0,  // 64 微秒
    POLL_ACT_TIME_128US,     // 128 微秒
    POLL_ACT_TIME_192US,     // 192 微秒
    POLL_ACT_TIME_256US,     // 256 微秒
    POLL_ACT_TIME_320US,     // 320 微秒
    POLL_ACT_TIME_384US,     // 384 微秒
    POLL_ACT_TIME_448US,     // 448 微秒
    POLL_ACT_TIME_512US,     // 512 微秒
    POLL_ACT_TIME_640US,     // 640 微秒
    POLL_ACT_TIME_768US,     // 768 微秒
    POLL_ACT_TIME_896US,     // 896 微秒
    POLL_ACT_TIME_1024US,    // 1024 微秒
    POLL_ACT_TIME_2048US,    // 2048 微秒
} poll_act_time;

/******************************************************************************
    全局变量声明
******************************************************************************/

/******************************************************************************
    全局函数声明
******************************************************************************/

/**
 * \brief 初始化TIC10024设备
 *
 * 该函数用于初始化TIC10024设备，包括获取设备ID、关闭监测、配置通道、配置轮询模式、
 * 配置轮询时间和激活时间、配置润湿电流和比较器阈值，并最后启动监测。
 */
extern void tic10024_init(void);

/**
 * \brief 获取tic10024设备的ID
 *
 * 从tic10024设备的寄存器中读取设备ID。
 *
 * \return 返回设备的ID，类型为uint32_t
 */
extern uint32_t tic10024_device_id_get(void);

/**
 * \brief 设置 TIC10024 输入通道使能状态
 *
 * 设置 TIC10024 输入通道的使能状态。如果指定 CHANNEL_ALL，则对所有输入通道进行操作。
 *
 * \param channel 输入通道编号，可以是单个通道编号或 CHANNEL_ALL
 * \param enable 使能状态，true 表示使能，false 表示禁用
 */
extern void tic10024_channel_in_en_set(tic_channel channel, bool enable);

/**
 * \brief 配置tic10024的通道润湿电流
 *
 * 该函数用于配置tic10024设备的指定通道或所有通道的润湿电流。
 *
 * \param channel 需要配置的通道，可以是单个通道（CHANNEL_0到CHANNEL_23）或所有通道（CHANNEL_ALL）
 * \param current 需要设置的润湿电流值
 */
extern void tic10024_channel_wetting_current_config(tic_channel channel, wetting_current current);

/**
 * \brief 配置TIC10024芯片的通道比较器阈值
 *
 * 该函数用于配置TIC10024芯片的通道比较器阈值。
 *
 * \param channel 要配置的通道
 * - CHANNEL_0 到 CHANNEL_23: 分别对应0到23号通道
 * - CHANNEL_ALL: 配置所有通道
 * \param threshold 要设置的比较器阈值
 */
extern void tic10024_channel_threshold_config(tic_channel channel, comparator_threshold threshold);

/**
 * \brief 设置tic10024芯片的清除当前轮询寄存器1通道湿电流的使能状态
 *
 * 该函数用于设置tic10024芯片的清除当前轮询寄存器1通道湿电流的使能状态。
 *
 * \param channel 要设置的通道。如果为CHANNEL_ALL，则表示对所有通道进行操作。
 * \param enable 是否使能该通道。true表示使能，false表示禁用。
 */
extern void tic10024_channel_ccp_cfg1_set(tic_channel channel, bool enable);

/**
 * \brief 读取指定通道的状态
 *
 * 该函数用于读取TIC10024设备指定通道的状态。
 *
 * \param channel 要读取的通道，可以是CHANNEL_A, CHANNEL_B等，或者使用CHANNEL_ALL读取所有通道的状态
 *
 * \return 如果channel为CHANNEL_ALL，返回所有通道的状态（32位），否则返回指定通道的状态（0或1）
 */
extern uint32_t tic10024_channel_status_read(tic_channel channel);

/**
 * \brief tic10024的软复位函数
 *
 * 该函数用于对tic10024进行软件复位。
 *
 * 首先读取CONFIG寄存器的值，然后将CONFIG_RESET_BIT位设置到该值中，
 * 并将新值写回CONFIG寄存器，从而触发复位操作。
 *
 * 接着，通过轮询INT_STAT寄存器的最低位（即POR标志位），
 * 等待该位被清除，表示复位操作已完成。
 */
extern void tic10024_soft_reset(void);

/**
 * \brief 设置TIC10024触发器的启用状态
 *
 * 该函数用于设置TIC10024控制器的触发器启用状态。
 *
 * \param enable 触发器的启用状态，true表示启用，false表示禁用
 */
extern void tic10024_trigger_set(bool enable);

/**
 * \brief 设置 TIC10024 的轮询模式
 *
 * 设置 TIC10024 是否进入轮询模式。
 *
 * \param enable 是否启用轮询模式，true 表示启用，false 表示禁用
 */
extern void tic10024_poll_mode_set(bool enable);

/**
 * \brief 配置TIC10024的轮询时间
 *
 * 该函数用于配置TIC10024的轮询时间。通过修改配置寄存器中的相应位来实现。
 *
 * \param time 轮询时间参数，其值决定了轮询的间隔时间。
 */
extern void tic10024_poll_time_config(poll_time time);

/**
 * \brief 配置tic10024的轮询激活时间
 *
 * 该函数用于配置tic10024设备的轮询激活时间。
 *
 * \param time 轮询激活时间。
 */
extern void tic10024_poll_act_time_config(poll_act_time time);

/**
 * \brief 设置TIC10024中断使能配置寄存器0
 *
 * 该函数用于设置TIC10024的中断使能配置寄存器0，以启用或禁用该寄存器中的所有中断。
 *
 * \param enable 是否启用中断，true表示启用，false表示禁用
 */
extern void tic10024_int_en_cfg0_set(bool enable);

/**
 * \brief 测试tic10024设备的功能
 *
 * 该函数初始化tic10024设备，并在一个无限循环中读取设备状态。当步数增加到200000的倍数时，读取所有通道的状态，
 * 并记录tic10024设备的各个状态标志。
 *
 * \return 无返回值
 */
extern int tic10024_test(void);

#endif // __TIC10024_API_H__
/* end of file */
